/*
 * CFileConverter.h
 *
 *  Created on: 2017年3月15日
 *      Author: chuanjiang.zh
 */

#ifndef CFILECONVERTER_H_
#define CFILECONVERTER_H_

#include "UMediaFileConverter.h"
#include "UniMediaWriter.h"
#include "UniMediaReader.h"

#include "TThread.h"
#include <memory>
#include <atomic>
#include <mutex>


typedef std::shared_ptr< UMediaWriter >		UMediaWriterPtr;
typedef std::shared_ptr< UMediaReader >		UMediaReaderPtr;

class CFileConverter: public UMediaFileConverter, public comn::Thread
{
public:
	CFileConverter();
	virtual ~CFileConverter();

	/**
	 * 打开
	 * @param inputPath	输入文件路径
	 * @param outputPath	输出文件路径
	 * @return 0 表示成功
	 */
	virtual int open(const char* inputPath, const char* outputPath);

	/**
	 * 关闭
	 */
	virtual void close();

	/**
	 * 是否打开
	 * @return
	 */
	virtual bool isOpen();

	/**
	 * 获取输入的媒体格式
	 * @param fmt
	 * @return
	 */
	virtual bool getFormat(UMediaFormat& fmt);

	/**
	 * 获取输入的媒体时长
	 * 单位为毫秒
	 * @return
	 */
	virtual int getDuration();

	/**
	 * 开始转换
	 * @return
	 */
	virtual int start();

	/**
	 * 停止转换
	 */
	virtual void stop();

	/**
	 * 获取转换状态 @see ConvertState
	 * @return
	 */
	virtual int getState();

	/**
	 * 获取输入文件路径
	 * @return
	 */
	virtual const char* getInput();

	/**
	 * 获取输出文件路径
	 * @return
	 */
	virtual const char* getOutput();

	/**
	 * 获取当前媒体时间
	 * @return
	 */
	virtual int64_t getTime();

	/**
	 * 获取当前转换进度
	 * @return
	 */
	virtual double getPos();

	/**
	 * 设置回调
	 * 在Open之前调用
	 * @param sink
	 */
	virtual void setSink(UMediaFileConverterSink* sink);

	virtual int64_t setId(int64_t id);

	virtual int64_t getId();

	virtual int64_t getStartTime();

	/**
	 * 获取转码持续时间, 单位位毫秒
	 */
	virtual int64_t getConvertElapse();

	virtual int64_t getConvertDuration();

protected:
	virtual int run();


	void closeInput();


	void setState(UMediaFileConverterState state);

	void fireState();


protected:
	std::mutex	m_fileMutex;

	std::string	m_inputPath;
	std::string	m_outputPath;

	std::atomic_int	m_state;
	int64_t		m_curTs;
	double		m_percent;
	int64_t		m_startTs;

	UMediaFileConverterSink*	m_sink;

	UMediaFormat	m_format;

	UMediaReaderPtr	m_reader;
	UMediaWriterPtr	m_writer;

	std::atomic< int64_t >	m_id;

	int64_t	m_convStartTime;
	int64_t	m_convElapse;

};


#endif /* CFILECONVERTER_H_ */
